﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;
using NGI_BaseDatos;
using NGI_Entidades;
using NGI_Auxiliares;
using NGI_Enumerador;

namespace NGI_Logica
{
    public class Facturas
    {
        public static Int32 CargarNumero(TiposFactura TipoFactura)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@strLetra", TipoFactura.ToString());

            DataTable dt = BaseDatos.Traer("proc_ObtenerNumeroDeFactura", ListadoParametros);
            if (dt.Rows.Count == 0)
                return 1;

            return Convert.ToInt32(dt.Rows[0]["Numero"]);
        }

        public static bool Crear(Factura unaFactura, Int32 UsuarioLogueadoID)
        {
            bool creada = false;
            Parametro[] ListadoParametros = new Parametro[11];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@chvTipoFacturaLetra", unaFactura.TipoFactura.ToString());
            ListadoParametros[2] = new Parametro("@intClienteID", unaFactura.Cabecera.Cliente.ID);
            ListadoParametros[3] = new Parametro("@intCategoriaIVA", unaFactura.Cabecera.CategoriaIVA);
            ListadoParametros[4] = new Parametro("@bitCondicionVenta", unaFactura.Cabecera.CondicionVenta == NGI_Enumerador.CondicionesVenta.Contado ? 1 : 0);
            ListadoParametros[5] = new Parametro("@chvRemito", unaFactura.Cabecera.Remito);

            ListadoParametros[6] = new Parametro("@dblPrecioSubTotal", unaFactura.Cabecera.SubTotal);
            ListadoParametros[7] = new Parametro("@dblImpuestos", unaFactura.Cabecera.Impuestos);
            ListadoParametros[8] = new Parametro("@dblIVAPorcentaje", unaFactura.Cabecera.PorcentajeIVA);
            
            ListadoParametros[9] = new Parametro("@chvObservaciones", unaFactura.Cabecera.Observaciones);
            
            ListadoParametros[10] = new Parametro("@bitActivo", 1);

            Object FacturaId = BaseDatos.Ejecutar("proc_InsertarFactura", ListadoParametros);

            unaFactura.ID = Convert.ToInt32(FacturaId);
            ListadoParametros = new Parametro[6];
            if (unaFactura.ID > 0){
                creada = true;
                foreach (FacturaDetalleElemento Detalle in unaFactura.Detalle)
                {
                    ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
                    ListadoParametros[1] = new Parametro("@intFacturaID", unaFactura.ID);
                    ListadoParametros[2] = new Parametro("@intCantidad", Detalle.Cantidad);
                    ListadoParametros[3] = new Parametro("@intProductoID", Detalle.Producto.ID);
                    ListadoParametros[4] = new Parametro("@dblPrecioUnitario", Detalle.PrecioUnitario);
                    ListadoParametros[5] = new Parametro("@bitActivo", 1);

                    creada = creada && Convert.ToInt32(BaseDatos.Ejecutar("proc_InsertarFacturaDetalle", ListadoParametros)) > 0;
                }

                if (!creada)
                {
                    Facturas.EliminarFactura(unaFactura);
                }

            }

            return creada;
        }

        private static void EliminarFactura(Factura unaFactura)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intFacturaID", unaFactura.ID);
            BaseDatos.Ejecutar("proc_EliminarFactura", ListadoParametros);
        }
    }
}
